package com.example.juc.until;

import org.junit.Test;

import java.util.concurrent.*;
import java.util.function.Function;


public class TheadPoolTest {
@Test
    public void Test1(){

    //七大参数  工作中使用这样创建线程池
        ExecutorService poolExecutor = new ThreadPoolExecutor(
                2,//正常情况下核心线程池大小  正常工作银行窗口
                Runtime.getRuntime().availableProcessors(), //(获取服务器)   最大线程池大小      正常工作银行窗口+休息银行窗口 最大
                3,//超时等待时间           等候区的超过时间
                TimeUnit.SECONDS,//超时时间单位
                new ArrayBlockingQueue<>(3),//阻塞队列  等候区超过3个人会触发 最大线程池大小  让休息的银行窗口工作
                Executors.defaultThreadFactory(),   //线程工程
                //四种拒绝策略   当阻塞队列和最大线程数用满了 会执行拒绝策略
               // new ThreadPoolExecutor.AbortPolicy()  AbortPolicy 最大线程和阻塞队列满了 抛异常策略RejectedExecutionException
                 new ThreadPoolExecutor.CallerRunsPolicy() //最大线程和阻塞队列满了 从哪里来到哪里去， 用主线程调用 会执行所有线程
               //   new ThreadPoolExecutor.DiscardPolicy()  //最大线程和阻塞队列满了 不会抛异常 多的也不会被执行    不会执行所有线程
                //  new ThreadPoolExecutor.DiscardOldestPolicy()   //最大线程和阻塞队列满了 不是去尝试竞争，而是直接丢弃最老的线程
        );
        try {
            for (int i = 1; i <=10; i++) {
                final int temp=i;
                poolExecutor.execute(() ->{
                    System.out.println(Thread.currentThread().getName()+"ok");
                });
            }
        }finally {
            poolExecutor.shutdown();
        }

    }
    public static void main(String[] args) {
        //使用线程池技术  就用线程池的方式来创建线程
        //线程工具类 Executors   不建议使用这种方法创建线程池
        //规避资源耗尽的风险.
        //线程池三大方法
       // ExecutorService threadExecutorPool = Executors.newSingleThreadExecutor();//开启单一线程
        //ExecutorService threadExecutorPool = Executors.newFixedThreadPool(5);//开启固定大小线程
        ExecutorService threadExecutorPool = Executors.newCachedThreadPool();//能创建多少个线程就创建多少个  最大93个
        try {
            for (int i = 1; i <100 ; i++) {
                threadExecutorPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName()+"   ok");
                });
            }
        }finally {
            //关闭线程池
            threadExecutorPool.shutdown();
        }
    }


}
